#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

/* 
    事先用mkfifo命令创建一个有名管道
    创建有名管道,并写入数据
    通过有名管道,实现一个进程先打印,另一个后打印
    运行命令: ./write
    结果：写进程先运行，由于有名管道读端还没有运行，所以该进程会阻塞
        直到读进程运行，写进程输出 “创建好有名管道写端”，和三行数据
        接着写入一个数据到管道
        读进程读到数据后结束阻塞，接着输出三行数据
*/
int main(int argc, char *argv[])
{
    // /*创建有名管道文件*/
    // if(0 == mkfifo("./myfifo", 0777))
    // {
    //     printf("有名管道创建成功\n");
    // }else{
    //     printf("有名管道创建失败\n");
    //     return -1;
    // }

    /*打开有名管道文件,此时才会在内核中创建队列*/
    int fd;
    fd = open("./myfifo", O_WRONLY);
    if(fd > 0){
        printf("创建好有名管道写端, fd = %d\n", fd);
    }

    /*输出三行数据, 这里会阻塞，因为要等另一个进程创建好有名管道读端*/
    for(int i = 0; i < 3; i++)
    {
        printf("first process\n");
    }
    sleep(2);
    char data = 1;
    /*写入数据*/
    write(fd, &data, 1);

    close(fd);

    return 0;
}

